#ifndef __PROTOTYPE__
#define __PROTOTYPE__

#include <iostream>
using namespace std;


class Prototype
{
	public:
		Prototype() {};
		virtual ~Prototype() {};
		
		virtual Prototype* Clone() = 0;

};

class Prototype1: public Prototype
{
	public:
		Prototype1() {};
		Prototype1(const Prototype1& type1) 
		{
			cout << "copy construction of Prototype1\n";
		}
		virtual ~Prototype1() {};
		
		virtual Prototype* Clone()
		{
			cout << "Prototype1: Clone\n";
			return new Prototype1(*this);
		}
	
};

class Prototype2: public Prototype
{
	public:
		Prototype2() {};
		Prototype2(const Prototype2& type2) 
		{
			cout << "copy construction of Prototype2\n";
		}
		virtual ~Prototype2() {};
		
		virtual Prototype* Clone()
		{
			cout << "Prototype2: Clone\n";
			return new Prototype2(*this);
		}
	
};

#endif
